      1  import java.io.IOException;

      2  import java.io.RandomAccessFile;

      3

      4  /**

      5     This class is a conduit to a random access file

      6     containing bank account records.

      7  */

      8  public class BankData

      9  {

     10     private RandomAccessFile file;

     11

     12     public static final int INT_SIZE = 4;

     13     public static final int DOUBLE_SIZE = 8;

     14     public static final int RECORD_SIZE = INT_SIZE + DOUBLE_SIZE;

     15

     16     /**

     17        Constructs a BankData object that is not associated with a file.

     18     */

     19     public BankData()

     20     {

     21        file = null;

     22     }

     23

     24     /**

     25        Opens the data file.

     26        @param filename the name of the file containing bank

     27        account information

     28     */

     29     public void open(String filename)

     30           throws IOException

     31     {

     32        if (file != null) { file.close(); }

     33        file = new RandomAccessFile(filename, "rw");

     34     }

     35

     36     /**

     37        Gets the number of accounts in the file.

     38        @return the number of accounts

     39     */

     40     public int size()

     41           throws IOException

     42     {

     43        return (int) (file.length() / RECORD_SIZE);

     44     }

     45

     46     /**

     47        Closes the data file.

     48     */

     49     public void close()

     50           throws IOException

     51     {

     52        if (file != null) { file.close(); }

     53        file = null;

     54     }

     55

     56     /**

     57        Reads a bank account record.

     58        @param n the index of the account in the data file

     59        @return a bank account object initialized with the file data

     60     */

     61     public BankAccount read(int n)

     62           throws IOException

     63     {

     64        file.seek(n * RECORD_SIZE);

     65        int accountNumber = file.readInt();

     66        double balance = file.readDouble();

     67        return new BankAccount(accountNumber, balance);

     68     }

     69

     70     /**

     71        Finds the position of a bank account with a given number.

     72        @param accountNumber the number to find

     73        @return the position of the account with the given number,

     74        or -1 if there is no such account

     75     */

     76     public int find(int accountNumber)

     77           throws IOException

     78     {

     79        for (int i = 0; i < size(); i++)

     80        {

     81           file.seek(i * RECORD_SIZE);

     82           int a = file.readInt();

     83           if (a == accountNumber) { return i; }

     84              // Found a match

     85        }

     86        return -1; // No match in the entire file

     87     }

     88

     89     /**

     90        Writes a bank account record to the data file.

     91        @param n the index of the account in the data file

     92        @param account the account to write

     93     */

     94     public void write(int n, BankAccount account)

     95           throws IOException

     96     {

     97        file.seek(n * RECORD_SIZE);

     98        file.writeInt(account.getAccountNumber());

     99        file.writeDouble(account.getBalance());

    100     }

    101  }